package com.fps.webshop.question.question0100_0199;

/**
 * 125. 验证回文串
 * 
 * 给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
 * 
 * 说明：本题中，我们将空字符串定义为有效的回文串。
 * 
 * 示例 1:
 * 输入: "A man, a plan, a canal: Panama"
 * 输出: true
 * 解释："amanaplanacanalpanama" 是回文串
 * 
 * 示例 2:
 * 输入: "race a car"
 * 输出: false
 * 解释："raceacar" 不是回文串
 * 
 * 提示：
 * 		1 <= s.length <= 2 * 10^5
 * 		字符串 s 由 ASCII 字符组成
 */
public class Question125 {
	
	
	/**
	 * 第一次提交，双指针
	 * 
	 * 提交结果	执行用时	内存消耗	语言		提交时间				备注
	 * 通过		2 ms	38.4 MB	Java	2021/08/20 17:07
	 * 
	 * 执行用时：2 ms, 在所有 Java 提交中击败了98.71%的用户
	 * 内存消耗：38.4 MB, 在所有 Java 提交中击败了71.25%的用户
	 */
	public static boolean isPalindrome(String s) {
		char[] ss = s.toCharArray();
		int start = 0;
		int end = s.length()-1;
		while(start<end) {
			if(isZiMuB(ss[start])||isShuZi(ss[start])) {
				
			}else if(isZiMuA(ss[start])) {
				ss[start] = (char) (ss[start]+32);
			}else {
				start++;
				continue;
			}
			
			if(isZiMuB(ss[end])||isShuZi(ss[end])) {
				
			}else if(isZiMuA(ss[end])) {
				ss[end] = (char) (ss[end]+32);
			}else {
				end--;
				continue;
			}
			
			if(ss[end]!=ss[start]) {
				return false;
			}else {
				start++;
				end--;
			}
		}
		return true;
    }
	
	public static boolean isZiMuA(Character c) {
		if(c>='A'&&c<='Z') {
			return true;
		}else {
			return false;
		}
	}
	public static boolean isZiMuB(Character c) {
		if(c>='a'&&c<='z') {
			return true;
		}else {
			return false;
		}
	}
	public static boolean isShuZi(Character c) {
		if(c>='0'&&c<='9') {
			return true;
		}else {
			return false;
		}
	}
	
	public boolean isPalindrome2(String s) {
		StringBuffer sgood = new StringBuffer();
		int length = s.length();
		for (int i = 0; i < length; i++) {
			char ch = s.charAt(i);
			if (Character.isLetterOrDigit(ch)) {
				sgood.append(Character.toLowerCase(ch));
			}
		}
		StringBuffer sgood_rev = new StringBuffer(sgood).reverse();
		return sgood.toString().equals(sgood_rev.toString());
	}

	 public boolean isPalindrome3(String s) {
		char[] chars = s.toCharArray();
		int i = 0, j = chars.length - 1;
		while (i <= j) {
			if ((97 <= chars[i] && chars[i] <= 122) || (65 <= chars[i] && chars[i] <= 90)
					|| (48 <= chars[i] && chars[i] <= 57)) {
				if ((97 <= chars[j] && chars[j] <= 122) || (65 <= chars[j] && chars[j] <= 90)
						|| (48 <= chars[j] && chars[j] <= 57)) {
					if ((65 <= chars[i] && chars[i] <= 90)) {
						chars[i] = (char) (chars[i] + 32);
					}
					if ((65 <= chars[j] && chars[j] <= 90)) {
						chars[j] = (char) (chars[j] + 32);
					}
					if (chars[i] != chars[j]) {
						return false;
					}
					i++;
					j--;
				} else
					j--;
			} else
				i++;
		}
		return true;
	}
	
	public static void main(String[] args) {
		String nums = "race a car";
		System.out.print(isPalindrome(nums));
	}
}
